package JDBClearn;

import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Scanner;



/**
 * 登录
 * 1、需求：模拟用户登录功能的实现。
 * 2、业务描述：
 *      程序运行时，提供一个输入的入口，可以让用户输入用户名和密码
 *      用户输入用户名和密码之后，提交信息，java程序收集到用户信息
 *      java程序与数据库建立连接，验证用户名和密码是否合法
 *      合法：显示登陆成功
 *      不合法：显示登录失败
 * 3、数据的准备：
 *      在实际开发中，表的设计会使用专业的建模工具：PowerDesigner
 *      使用PD工具来进行数据库表的设计。（参见D:/javapro/resource/user-login.sql脚本）
 * 4、sql注入
 *      请输入用户名：asd
 *      请输入密码：asd' or '1'='1
 *      登录成功！
 *
 *      进程已结束，退出代码为 0
 *   这种现象被称为SQL注入攻击，攻击者可以利用sql注入攻击来获取数据库中的敏感信息。
 *   String sql ="select * from t_user where loginName = '" +
 *                     userLoginInfo.get("loginName")+"' and loginPWD = '" +
 *                     userLoginInfo.get("loginPWD") + "'";
 *   以上代码正好完成了sql语句的拼接，发送sql语句给DBMS，DBMS进行sql编译，
 *   正好将用户提供的“非法信息”编译进去了，导致了原sql语句的含义被扭曲了。
 *
 */

public class JDBClogin {

    public static void main(String[] args){

        //初始化一个界面
        Map<String,String> userLoginInfo = initUI();
        //验证用户名和密码
        boolean loginSuccess = login(userLoginInfo);
        if(loginSuccess) System.out.println("登录成功！");
        else System.out.println("登陆失败！");

    }

    /**
     * 初始化用户界面
     * @return 用户输入的用户名和密码
     */
    private static Map<String, String> initUI() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入用户名：");
        String loginName = sc.nextLine();

        System.out.print("请输入密码：");
        String loginPWD = sc.nextLine();//这里用next()就不会出现sql注入

        Map<String,String> userLoginInfo = new HashMap<>();
        userLoginInfo.put("loginName",loginName);
        userLoginInfo.put("loginPWD",loginPWD);

        return userLoginInfo;
    }

    /**
     * 验证用户名和密码
     * @param userLoginInfo 用户输入的用户名和密码
     * @return 登录成功返回true，登录失败返回false
     */
    private static boolean login(Map<String,String> userLoginInfo){
        boolean loginSuccess = false;
        //JDBC代码
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try{
            ResourceBundle rb = ResourceBundle.getBundle("com/itheima/jdbc/fileTest/jdbc");
            String driver = rb.getString("driver");
            String url = rb.getString("url");
            String user = rb.getString("user");
            String password = rb.getString("password");
            //1、注册驱动（通过反射机制，类加载时执行static块中的代码）
            Class.forName(driver);
            //2、获取连接
            conn = DriverManager.getConnection(url,user,password);
            //3、获取执行sql语句的对象
            stmt = conn.createStatement();
            //4、执行sql语句
            String sql ="select * from t_user where loginName = '" +
                    userLoginInfo.get("loginName")+"' and loginPWD = '" +
                    userLoginInfo.get("loginPWD") + "'";
            rs = stmt.executeQuery(sql);
            //5、处理结果集
            if(rs.next())loginSuccess = true;


        }catch(SQLException e){
            e.printStackTrace();
        }catch(ClassNotFoundException e) {
            e.printStackTrace();
        }finally{
            try{
                if(rs!=null)rs.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
            try{
                if(stmt!=null)stmt.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
            try{
                if(conn!=null)conn.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
        }

        return loginSuccess;
    }

}
